import store from '@/store/index.js'; // 引入全局状态管理文件

// 引用方法
import API from './api.js';

import {
	request
} from './util.js';

import Exclusion from './Exclusion.js'; // 互斥函数
import Relevance from './Relevance.js'; // 关联函数
import Products from './Products.js'; // 产品库函数
import ExcludeCartProduct from './ExcludeCartProduct.js'; // 排除购物车指定不存在的产品

/**
 * 初始化(菜单)数据
 * */
class InitMenuData {
	constructor(storeInfo) {
		this.storeInfo = storeInfo; // 门店信息
		this.originProducts = []; // 显示菜单用的原结构产品列表数据
		this.bannerList = []; // 菜单banner图列表
	}
	
	// 请求接口 && 初始化数据
	async init() {
		const storeInfo = this.storeInfo;
		const diningMode = store.state.diningMode;
		// 请求菜单数据
		const menu_params = {
			sceneId: diningMode === 'wx_zq' ? 'wx_ts' : diningMode, // 注：自取场景是取的堂食的菜单数据
			orgCode: storeInfo.id,
			xcxVersion: 1
		};
		const menuDatas = request(API.queryMenuInfos, menu_params); // 获取菜单数据
	
		// 请求门店配置数据
		const config_params = {
			shopid: storeInfo.shopID,
			saleType: diningMode
		}
		const configDatas = request(API.queryConfig, config_params); // 获取配置信息
	
		/**
		 * 通过Primise.all() 方法，当两个接口都执行完后再继续执行下面的方法 
		 * menuList    菜单列表, 
		 * configInfo  门店配置信息, 
		 * severTime   当前时间, 
		 * isExecute   是否执行
		 * */
		const {
			menuList,
			configInfo,
			severTime,
			isExecute
		} = await Promise.all([menuDatas, configDatas]).then(datas => {
			const [menus, configs] = datas;
	
			// 通过try catch 捕获异常，如：其中一个接口调不通，则都不继续执行了	
			try {
				const resData = {
					menuList: menus.jsonList || [],
					configInfo: configs.data || {},
					severTime: configs.serverTime,
					isExecute: true
				};
				return resData;
			} catch (e) {
				uni.showToast({
					title: '菜单获取失败，请重新进入再试',
					icon: 'none',
					duration: 5000
				});
				return {
					isExecute: false
				};
			}
	
		});
	
		if (!isExecute) return;
	
		// 关联映射 --> 关联关系、互斥关系
		this.relationMap(configInfo);
		
		
		// 处理产品 & 组产品库 & 筛选banner
		this.handleProducts(menuList, severTime);
	
	}

	// 关系映射
	relationMap(originRes) {
		// 互斥关系库
		if (originRes.productExclusive) {
			const exclusionList = originRes.productExclusive;
			const exclusion = new Exclusion(exclusionList);
			const exclusionMap = exclusion.init() || {};

			store.commit('cacheExclusionMap', exclusionMap)
		}

		// 关联关系库
		if (originRes.productRelatice) {
			const relevanceList = originRes.productRelatice;
			const relevance = new Relevance(relevanceList);
			const relevanceMap = relevance.init() || {};

			store.commit('cacheRelevanceMap', relevanceMap)
		}

		// 餐盒费
		// if (originRes.boxConfig) {
		// 	store.commit('cacheBoxFeeConfig', originRes.boxConfig)
		// }
	}

	// 处理产品 & 组产品库 & 筛选banner
	handleProducts(result, severTime) {
		// 菜单banenr
		const bannerType = result.filter(x => x.col_type === '1')[0] || {};
		const bannerProducts = bannerType.products || [];
		const bannerList = [];
		bannerProducts.length && bannerProducts.map(item => {
			bannerList.push({
				bn_img_url: item.bn_img_url,
				bn_link_url: item.bn_link_url,
				bn_type: item.bn_type
			});
		});
		this.bannerList = bannerList;

		// 产品处理 (获取产品库)
		const allProducts = new Products(result, severTime);
		const originProducts = allProducts.init() || []; // 初始化菜单用的 
		const productsMap = allProducts.getMap() || {}; // 获取产品库

		// 原来的产品库
		const originProductsMap = store.state.productsMap || {};

		// 缓存新的产品库
		store.commit('cacheProductsMap', productsMap);

		// 处理不存在的产品
		new ExcludeCartProduct(originProductsMap, productsMap).out();

		this.originProducts = originProducts;
		this.bannerList = bannerList;
	}
	
	// 输出
	output() {
		return {
			originProducts: this.originProducts,
			bannerList: this.bannerList
		}
	}
}

module.exports = InitMenuData;
